kubectl logs 排查問題在微服務架構下的瓶頸。kubectl logs 不夠用?在前面的實作中,我們習慣用 kubectl logs <pod-name> 來查看容器日誌。但當系統進入生產環境時,會面臨三大致命瓶頸:
| 痛點 | 說明 |
|---|---|
| 1. 容器重啟後日誌遺失 | 當 Pod 發生 Crash 或重啟時,舊容器的歷史日誌隨之消失,難以追蹤事發原因。 |
| 2. 多副本難以聚合查詢 | 當 Deployment 開了 10 個 Pod,你無法預測報錯出現在哪一個 Pod 上,逐一手動查看極無效率。 |
| 3. 跨微服務追蹤困難 | 一個電商結帳請求涉及會員、訂單、金流等多個 Pod,無法在單一介面進行時間軸關聯搜尋。 |
因此,建立一套**「集中式日誌收集與搜尋系統」**是上線後的必備基石。
過去業界最常使用的日誌方案是 ELK(Elasticsearch + Logstash + Kibana),但 Elasticsearch 會為整段日誌全文建立倒排索引(Inverted Index),非常消耗 CPU 與記憶體(往往佔用數十 GB RAM)。
Grafana Labs 推出的 Loki 被譽為「日誌界的 Prometheus」:
app=nginx, namespace=default)建立索引,日誌內容本身則進行壓縮存入物件儲存或硬碟。| 元件 | 角色定位 | 運作機制 |
|---|---|---|
| Promtail | 採集代理(Agent) | 以 DaemonSet 方式在每個節點運行,自動抓取該節點上所有容器產生的日誌並打上標籤。 |
| Loki | 儲存中樞(Server) | 接收 Promtail 傳來的日誌,建立標籤索引並持久化儲存。 |
| Grafana | 查詢介面(UI) | 使用 LogQL 語法向 Loki 發送查詢請求,並在網頁上視覺化呈現。 |
我們使用 Grafana 官方 Helm Repo 快速完成安裝。
helm repo add grafana [https://grafana.github.io/helm-charts](https://grafana.github.io/helm-charts)
helm repo update
將 Loki 與 Promtail 安裝至 Day 24 建立的 monitoring 命名空間中:
helm install loki-stack grafana/loki-stack \
--namespace monitoring \
--set promtail.enabled=true \
--set loki.persistence.enabled=false
檢查 Promtail 與 Loki Pod 是否已正常啟動:
kubectl get pods -n monitoring -l "app in (loki, promtail)"
使用端口轉發開啟 Grafana(沿用 Day 24 的服務):
kubectl port-forward --namespace monitoring svc/prometheus-stack-grafana 3000:80
打開瀏覽器進入 http://localhost:3000:
[http://loki-stack.monitoring.svc.cluster.local:3100](http://loki-stack.monitoring.svc.cluster.local:3100)
點選 Grafana 左側選單的 Explore(指南針圖示),右上角資料來源選擇 Loki。
在搜尋框中輸入 LogQL 查詢語法:
查詢 default 命名空間下所有應用的即時日誌:
{namespace="default"}
精準過濾特定 App 的日誌,並搜尋含有 "error" 關鍵字的紀錄:
{app="nginx-app"} |= "error"
排除健康檢查探針產生的無效日誌(例如排除含有 "kube-probe" 的行):
{app="nginx-app"} != "kube-probe"
點擊右上角的 Run query,下方就會即時列出所有符合條件的日誌串流,並支援點擊展開查看單一 Log 的完整詳細資訊!
今天我們成功搞懂並搭建了雲原生主流的日誌解決方案:
現在我們擁有了自動擴縮(HPA)、指標監控(Prometheus/Grafana)與集中日誌(Loki)。但在企業維運中,若沒有嚴格的權限控管,任何人都可能不小心 kubectl delete pod 甚至刪除整個集群。
明天 Day 26,我們將進入企業資安核心:「集群安全守門員:RBAC 角色權限控管與 ServiceAccount」!